<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="hHKDK" id="hHKDK"><span data-lake-id="u4c081676" id="u4c081676">典型回答</span></h1>
  <p data-lake-id="u8a96dc9b" id="u8a96dc9b"><br></p>
  <p data-lake-id="uec2fbf4f" id="uec2fbf4f"><span data-lake-id="ue17f2fb5" id="ue17f2fb5">Java中的线程池本身并不提供内置的方式来保证任务的顺序执行的，因为线程池的设计目的是为了提高并发性能和效率，如果顺序执行的话，那就和单线程没区别了。</span></p>
  <p data-lake-id="u39f0395f" id="u39f0395f"><span data-lake-id="uc864adc7" id="uc864adc7">​</span><br></p>
  <p data-lake-id="uaba17bb6" id="uaba17bb6"><span data-lake-id="u0ddc207c" id="u0ddc207c">但是如果被问到想要实现这个功能该怎么做，有以下两种方式。</span></p>
  <p data-lake-id="u6ca01ada" id="u6ca01ada"><span data-lake-id="u5e3deec9" id="u5e3deec9">​</span><br></p>
  <p data-lake-id="u5af87d8d" id="u5af87d8d"><span data-lake-id="u02b710e2" id="u02b710e2">1、使用单线程线程池</span></p>
  <p data-lake-id="u77d13e6c" id="u77d13e6c"><span data-lake-id="u50770cee" id="u50770cee">​</span><br></p>
  <p data-lake-id="ua00574e9" id="ua00574e9"><span data-lake-id="udfdaad46" id="udfdaad46">我们可以使用SingleThreadExecutor这种线程池来执行任务，因为这个线程池中只有一个线程，所以他可以保证任务可以按照提交任务被顺序执行。</span></p>
  <p data-lake-id="uc267f6ab" id="uc267f6ab"><span data-lake-id="uc6b85969" id="uc6b85969">​</span><br></p>
  <pre lang="java"><code>
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(task1);
executor.submit(task2);
executor.submit(task3);
// 任务按照提交的顺序逐个执行
executor.shutdown();

</code></pre>
  <p data-lake-id="uba256179" id="uba256179"><br></p>
  <p data-lake-id="ua4731934" id="ua4731934"><br></p>
  <p data-lake-id="u94ae1ebe" id="u94ae1ebe"><span data-lake-id="ud50992c5" id="ud50992c5">2、使用有依赖关系的任务调度方式</span></p>
  <p data-lake-id="u71368798" id="u71368798"><span data-lake-id="uae45112d" id="uae45112d">​</span><br></p>
  <p data-lake-id="u802bc2d3" id="u802bc2d3"><span data-lake-id="u61945a7c" id="u61945a7c">可以使用ScheduledThreadPoolExecutor结合ScheduledFuture来实现任务的顺序执行。将任务按照顺序提交给线程池，每个任务的执行时间通过ScheduledFuture的get()方法等待前一个任务完成。</span></p>
  <p data-lake-id="uc7347551" id="uc7347551"><span data-lake-id="u5a5ac817" id="u5a5ac817">​</span><br></p>
  <pre lang="java"><code>
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
ScheduledFuture&lt;?&gt; future1 = executor.schedule(task1, 0, TimeUnit.MILLISECONDS);
ScheduledFuture&lt;?&gt; future2 = executor.schedule(task2, future1.get(), TimeUnit.MILLISECONDS);
ScheduledFuture&lt;?&gt; future3 = executor.schedule(task3, future2.get(), TimeUnit.MILLISECONDS);
// 任务会按照依赖关系和前一个任务的执行时间逐个执行
executor.shutdown();
</code></pre>
 </body>
</html>